package com.cn.dao.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Query;
import org.springframework.transaction.annotation.Transactional;
import com.cn.dao.BasicDao;


@Transactional
public class BasicDaoImpl<T>  implements BasicDao<T> {

	@Resource(name="sessionFactory")  
	SessionFactory sessionFactory;
	
	public SessionFactory getSessionFactory() {
		
		return sessionFactory;
	}

	//测试一下这个办法
	public List<T> findOneValue(String obj,String tableName){
	
		return sessionFactory.getCurrentSession().createQuery("select "+obj+" from "+tableName+"").list();
	}
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}

	@Override
	public void add(T obj) {
		System.out.println("findById");
		sessionFactory.getCurrentSession().save(obj);
	}

	@Override
	public T findById(Class clazz,Serializable id) {
		System.out.println("findById");
		Object obj=sessionFactory.getCurrentSession().get(clazz, id);
		if(obj!=null){
			return (T) obj;
		}
		return null;
	}

	@Override
	public List<T> executeQuery(String hql, Object[] paras) {
		System.out.println("executeQuery");
		List<T> list=new ArrayList();
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		//先判断我们的参数是否为空
		if(paras!=null && paras.length>0){
			//开始赋值
			for(int i=0;i<paras.length;i++){
				query.setString(i,paras[i].toString());
			}
		}
		list=query.list();
		if(list.size()>0){
			return list;
		}
		return null;
	}

	@Override
	public T uniqueQuery(String hql, Object[] paras) {
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		//先判断我们的参数是否为空
		if(paras!=null && paras.length>0){
			//开始赋值
			for(int i=0;i<paras.length;i++){
				query.setString(i,paras[i].toString());
			}
		}
		Object obj=query.uniqueResult();
		if(obj!=null){
			return (T) obj;
		}
		return null;
	}

	@Override
	public List<T> excuteQuery(String hql, Object[] paras, int pageSize,
			int pageNow) {
		List<T> list=new ArrayList();
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		//先判断我们的参数是否为空
		if(paras!=null && paras.length>0){
			//开始赋值
			for(int i=0;i<paras.length;i++){
				query.setString(i,paras[i].toString());
			}
		}
		query.setFirstResult((pageNow-1)*pageSize).setMaxResults(pageSize);
		list=query.list();
		if(list.size()>0){
			return list;
		}
		return null;
	}
	
	@Override
	public int getCountPage(String obj,int pageSize,int pageNow) {
		String hql="from "+obj+"";
		List list=sessionFactory.getCurrentSession().createQuery(hql).list();
		int rowCount=list.size();
		int pageCount=(rowCount-1)/pageSize+1;
		return pageCount;
	}

	@Override
	public void excuteUpdate(String hql, Object[] paras) {
		//使用线程开启session	
		Query query=sessionFactory.getCurrentSession().createQuery(hql);
		//先判断我们的参数是否为空
		if(paras!=null && paras.length>0){
			//开始赋值
			for(int i=0;i<paras.length;i++){
				query.setString(i,paras[i].toString());
			}
		}
		query.executeUpdate();
	}
	
	//操作并发性的时候需要用到
	public void excuteUpdate(String hql[], Object[][] paras) {
		//使用线程开启session
		Session session=sessionFactory.getCurrentSession();
		Query query=null;
		if(paras!=null){
			for(int i=0;hql!=null&&i<hql.length;i++){
				query=session.createQuery(hql[i]);
				for(int j=0;j<paras[i].length;j++){
					//开始赋值
					query.setString(j, paras[i][j].toString());
				}
				query.executeUpdate();
			}
		}
	}

	/*删除职位*/
	@Override
	public void delete(T t) {
		sessionFactory.getCurrentSession().delete(t);
	}
}
